package Partido;

import equipos.Formacion;

/**
 * TODO: description
 */
public class PartidoDeCopa extends Partido {
    /* VARIABLES DE INSTANCIA */
    private PartidoSimple partido1;

    private PartidoSimple partido2;

    int campoDeGolesParaPenalesFormacion1;

    int campoDeGolesParaPenalesFormacion2;

    /* CONSTRUCTOR */
    public PartidoDeCopa(final PartidoSimple partido1, final PartidoSimple partido2, final int golesPenalesFormacion1,
            final int golesPenalesFormacion2) {
        this.partido1 = partido1;
        this.partido2 = partido2;
        this.campoDeGolesParaPenalesFormacion1 = golesPenalesFormacion1;
        this.campoDeGolesParaPenalesFormacion2 = golesPenalesFormacion2;
    }

    @Override
    public Formacion equipoGanador() {

        Formacion ganadorPartido1 = this.partido1.equipoGanador();
        Formacion ganadorPartido2 = this.partido2.equipoGanador();
        boolean hayGanador = !(ganadorPartido1 == null && ganadorPartido2 == null);
        boolean condicion1 = ganadorPartido1 == ganadorPartido2;
        boolean e1null = ganadorPartido1 == null;
        boolean e2null = ganadorPartido2 == null;
        Formacion equipoGanador = null;

        if (hayGanador) {
            // Pregunto si los dos partidos los gano el equipo1, o si gano el primero y empato el segundo
            if (condicion1 || !e1null && e2null) {
                equipoGanador = ganadorPartido1;
            } else { // Los partidos no fueron ganados por el mismo o el que gano el primero empato el segundo
                if (e1null && !e2null) {
                    equipoGanador = ganadorPartido2;
                }
                // Ganaron un partido cada uno
                else {
                    equipoGanador = this.diferenciaDeGol();
                }
            }
        }
        // No hubo equipo ganador, se define por penales
        else {
            equipoGanador = this.irALosPenales();
        }
        System.out.println(equipoGanador);
        return equipoGanador;
    }

    private Formacion diferenciaDeGol() {
        int golesF1 = this.partido1.getCampoDeGolesEquipo1() + this.partido2.getCampoDeGolesEquipo1();
        int golesF2 = this.partido1.getCampoDeGolesEquipo2() + this.partido2.getCampoDeGolesEquipo2();

        // La formacion 1 tiene mayor diferencia de gol que la formacion 2
        if (golesF1 > golesF2) {
            return this.partido1.equipo1;
        } else {
            // La formacion 2 tiene mayor diferencia de gol
            if (golesF2 < golesF1) {
                return this.partido1.equipo2;
            } else { // Tienen igual diferencia de gol
                return this.irALosPenales();
            }
        }
    }

    private Formacion irALosPenales() {
        // Pregunto si el equipo 1 metio mas goles en penales que el equipo 2
        if (this.campoDeGolesParaPenalesFormacion1 > this.campoDeGolesParaPenalesFormacion2) {
            return this.partido1.getEquipo1();
        } else {// En los penales no hay empate
            return this.partido1.getEquipo2();
        }
    }

}
